let request = (function(outter){
	let responser = outter;
	return function(request_data) {
		console.log(request_data);
		return responser;
	};
})({
	response : function(response_data) {
		console.log(response_data);
	}
});

/**
* 节点分类
**/
const NODE_CATEGORY = {
	/**
	* 开始
	*/
	START : "START" ,

	/**
	* 结束
	*/
	END : "END" ,

	/**
	* 计算
	*/
	CALCULATOR : "CALCULATOR",

	/**
	* 逻辑
	*/
	CONDITION : "CONDITION" ,

	/**
	* 驱动
	*/
	DRIVER : "DRIVER"
};

class NodeDefine {
	constructor() {
		this.type = ""; // 节点类型，流程系统内所有已经建立的节点类型都拥有唯一标识符
		this.category = ""; // 流程节点类型 NODE_CATEGORY.START
		this.prev_capacity = [new LinkDefine()];
		this.next_capacity = [new LinkDefine()];
		this.modeling = MODEL_STYLE.STATIC; // 数据模型
	}
}

/**
* 连接类型，每个节点如存在特别限定的连线类型，就需要注册一个新的连线类型
**/
const LINK_TYPE = {
	/**
	*
	*/
	NORMAL = "";

	/**
	* 
	*/
	IF_YES = "";

	/**
	*
	*/
	IF_NOT = "";
};

const LINK_STYLE = {
	INFINITY = "";

	ONLY_ONE = "";
};

const MODEL_STYLE = {
	/**
	* 静态
	**/
	STATIC = "";

	/**
	* 动态，input.* 有任何绑定变更时，输出模型都有可能会改变
	**/
	INPUT_CHANGED = "";
}

class LinkDefine {
	constructor() {
		this.type = LINK_TYPE.NORMAL; // 连线类型，连线类型是全局唯一的
		this.style = LINK_STYLE.INFINITY; // 连线风格
	}
}

/**
* 根据 场景（即三种类型值组合） 获取工具箱中所有组件
**/
request({
	/**
	* 工单类型
	*/
	order_type : "" , 
	/**
	* 产品类型
	*/
	production_type : "" ,
	/**
	* 操作类型
	*/
	action_type : ""
}).response([
	new NodeDefine() , 
	new NodeDefine()
]);

const PROPERTY_TYPE = {
	INT = "";
	STRING = "";
	BOOLEAN = "";
}

class ComplexDefine {
	constructor() {
		this.members = new Map();
	}
}

class SimpleDefine {
	constructor() {
		/**
		* 名称
		*/
		this.name = "";
		/**
		* 类型
		*/
		this.type = "";
		/**
		* 说明
		*/
		this.comment = "";
	}
}

request({
	type : ""
}).response({
	in : new ComplexDefine() , 
	out : new ComplexDefine()
});

class Link {
	constructor() {
		this.type = "";
		this.target = ""; //目标节点 id 即 Node.id

		this.meta = "";
	}
}

class Node {
	constructor() {
		/**
		* 节点实例的唯一标识符，编撰流程时每次添加一个新节点，都会为其设置一个流程内唯一名称
		*/
		this.id = "";

		/**
		* 节点类型 即 NodeDefine.type
		*/
		this.type = "";

		/**
		* 后续连线
		*/
		this.next = [new Link()];

		/**
		* 数据绑定设置
		* (string) : 数据绑定目标表达式
		* @Type {string , Bind}
		**/
		this.bindings = new Map();


		this.meta = "";
	}
}

/**
* 数据绑定设置
**/
class Bind {
	constructor() {
		/**
		* 数据来源表达式，使用全限定名批出数据来源
		*/
		this.from = "";
	}
}

request({
	id: "",
	nodes : [
		new Node() ,
		new Node() ,
		new Node() ,
		new Node()
	],
	meta: ""
}).response({
	code : 200
});

